//============================================================================
// Name        : WinCAL.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : WinCal in C++, Ansi-style
//============================================================================
#include "WinCal.h"
#include "BitTest.h"
#include "BitStreamTest.h"
#include <string>

int charSum[256];

void parametrosErrados(int num)
{
	cout << "O parametro mal introduzido corresponde ao " ;
	if(num == 1)
	{
		cout << "campo compressao. Por favor siga o formato indicado:" << endl << endl;
	}
	if(num == 2)
	{
		cout << "campo algoritmo. Por favor siga o formato indicado:" << endl << endl;
	}
	cout << "<Compressao Algoritmo FicheiroInput FicheiroOutput> " << endl;
	cout << "Compressao:  Comprimir -c Descomprimir -d" << endl;
	cout << "Algoritmo:  Huffman -h LZW -lzw " << endl;
}

void printCompInfo(const char* cf1, const char* cf2)
{
	FILE *f;
	FILE *f2;
	f = fopen(cf1, "rb");
	f2 = fopen(cf2, "rb");
	double sizeIni = Huffman::get_file_size(f) / 1024.0;
	double sizeFin = Huffman::get_file_size(f2) / 1024.0;
	fclose(f);
	fclose(f2);
	printf("Tamanho inicial = %0.2fkb.\n", sizeIni);
	printf("Tamanho final = %0.2fkb.\n", sizeFin);
	printf("Ratio = %0.2f.\n", sizeFin / sizeIni);
}

int main(int argc, const char* argv[])
{
	cout << "WinCAL 2011 - Version Pro ($989.0)" << endl;

	if(argc == 1)
	{
		cout << "No arguments. Read the manual($75)." << endl << endl;
		cout << "Insira os dados da seguinte forma: "<<  endl << endl;
		cout << "<Compressao Algoritmo FicheiroInput FicheiroOutput> " << endl;
		cout << "Compressao:  Comprimir -c Descomprimir -d" << endl;
		cout << "Algoritmo:  Huffman -h LZW -l " << endl;
		exit(1);
	}

	if(argc < 3)
	{
		cout << "Dados introduzidos incorrectamente! P.f siga o formato:" << endl << endl;
		cout << "<Compressao Algoritmo FicheiroInput FicheiroOutput> " << endl;
		cout << "Compressao:  Comprimir -c Descomprimir -d" << endl;
		cout << "Algoritmo:  Huffman -h LZW -lzw " << endl;
		exit(1);
	}

	if(argc == 4)
	{
		cout << argv[1] << endl;
		cout << argv[2] << endl;
		cout << argv[3] << endl;
		if(strcmp(argv[2], "-h") == 0)
		{
			if(strcmp(argv[1], "-c") == 0)
			{
				cout << "A comprimir..." << endl;
				Huffman huffy = Huffman(argv[3], string(string(argv[3]) + ".cal").c_str());
				huffy.compress();
				cout << "Concluido." << endl;
				printCompInfo(argv[3], string(string(argv[3]) + ".cal").c_str());


			} else if(strcmp(argv[1], "-d") == 0)
			{
				cout << "A descomprimir..." << endl;
				Huffman huffy = Huffman(argv[3],  string(string(argv[3]) + ".cal").c_str());
				huffy.decompress();
				cout << "Concluido." << endl;

			} else
			{
				parametrosErrados(1);
				return -1;
			}
		} else if(strcmp(argv[2], "-lzw") == 0)
		{
			if(strcmp(argv[1], "-c") == 0)
			{
				cout << "A comprimir..." << endl;
				LZW lzwy = LZW(argv[3], string(string(argv[3]) + ".cal").c_str());
				lzwy.compress();
				cout << "Concluido." << endl;
				printCompInfo(argv[3], string(string(argv[3]) + ".cal").c_str());
			}
			else if(strcmp(argv[1], "-d") == 0)
			{
				cout << "A descomprimir..." << endl;
				LZW lzwy = LZW(argv[3], string(string(argv[3]) + ".cal").c_str());
				lzwy.decompress();
				cout << "Concluido." << endl;

			} else
			{
				parametrosErrados(1);
				return -1;
			}
		} else
		{
			parametrosErrados(2);
			return -1;
		}
	}

	if(argc == 5)
	{
		if(strcmp(argv[2], "-h") == 0)
		{
			if(strcmp(argv[1], "-c") == 0)
			{
				cout << "A comprimir..." << endl;
				Huffman huffy = Huffman(argv[3], argv[4]);
				huffy.compress();
				cout << "Concluido." << endl;
				printCompInfo(argv[3], argv[4]);

			}else if(strcmp(argv[1], "-d")== 0)
			{
				cout << "A descomprimir..." << endl;
				Huffman huffy = Huffman(argv[3],  argv[4]);
				huffy.decompress();
				cout << "Concluido." << endl;
			} else
			{
				parametrosErrados(1);
				return -1;
			}
		} else if(strcmp(argv[2], "-lzw") == 0)
		{
			if(strcmp(argv[1], "-c")== 0)
			{
				cout << "A comprimir..." << endl;
				LZW lzwy = LZW(argv[3],  argv[4]);
				lzwy.compress();
				cout << "Concluido." << endl;
				printCompInfo(argv[3], argv[4]);
			} else if(strcmp(argv[1], "-d")== 0)
			{
				cout << "A descomprimir..." << endl;
				LZW lzwy = LZW(argv[3],  argv[4]);
				lzwy.decompress();
				cout << "Concluido." << endl;
			} else
			{
				parametrosErrados(1);
				return -1;
			}
		} else
		{
			parametrosErrados(2);
			return -1;
		}
	}

	if(argc > 6)
	{
		cout << "Dados introduzidos incorrectamente! P.f siga o formato:" << endl << endl;
		cout << "<Compressao Algoritmo FicheiroInput FicheiroOutput> " << endl;
		cout << "Compressao:  Comprimir -c Descomprimir -d" << endl;
		cout << "Algoritmo:  Huffman -h LZW -l " << endl;
		exit(1);

	}
	/*
	LZW lzwy = LZW(argv[1], argv[2]);
	lzwy.compress();
	LZW lzwyd = LZW(argv[2], "dumplzw.txt");
	lzwyd.decompress();

*/

	return 0;
}
